<?php
namespace app\index\controller;
use app\index\controller\Base;
use think\Request;
use app\index\model\User as UserModel;
use think\Session;

class User extends Base{
	// 登录界面
	public function login(){
		$this->alreadyLogin(); //防止用户重复登录
		$this->assign('title','用户登录');
		$this->assign('keywords','php中文网');
		$this->assign('desc','thinkphp5实战案例');
		$this->assign('copyRight','本案例仅供学院交流，请勿商用，责任自负');
		return $this->fetch();
	}

	// 验证登录
	public function checkLogin(Request $request){
		// 初始返回参数
		$status=0; //验证状态码
		$result=''; //提示信息
		$data=$request->param(); //获取提交的参数

		// 创建验证规则
		$rule=[
			'name|用户名'=>'require', //用户名必填
			'password|密码'=>'require', //密码必填
			'verify|验证码'=>'require|captcha' //验证密码必填并验证
		];

		// 自定义验证失败提示信息
		$msg=[
			'name'=>['require'=>'用户名不能为空，请检查'],
			'password'=>['require'=>'密码不能为空，请检查'],
			'verify'=>[
				'require'=>'验证码不能为空，请检查',
				'captcha'=>'验证码错误'
			]
		];

		// 进行验证，validate(三个参数):1.验证的数据，2.验证规则，3.用户自定义的失败提示信息[可选]
		// $result只会返回两种值：1.ture：验证通过，2.'字符串'：用户自定义的错误提示
		$result=$this->validate($data,$rule,$msg);

		// 如果验证通过则执行
		if($result===true){
			// 构造查询条件
			$map=[
				'name'=>$data['name'],
				'password'=>md5($data['password'])
			];

			// 查询用户信息
			$user=UserModel::get($map);
			if($user===null){
				$result='用户名或密码错误';
			}else{
				$status=1;
				$result='登录成功';

				// 创建Session，用来检测用户登录状态和防止重复登录
				Session::set('user_id',$user->id); //用户id
				Session::set('user_info',$user->getData()); //用户所有信息

				// 更新用户登录次数,自增
				$user->setInc('login_count');
			}
		}

		return ['status'=>$status,'message'=>$result,'data'=>'$data'];
	}

	// 退出登录
	public function logout(){
		// 退出前先更新登录时间字段，下次登录时就知道上次登录时间
		UserModel::update(['login_time'=>time()],['id'=>Session::get('user_id')]);

		// 注销session
		Session::delete('user_id');
		Session::delete('user_info');
		$this->success('注销登录，正在返回',url('user/login'));
	}

	// 管理员列表
	public function adminList(){
		$this->view->assign('title','管理员列表');
		$this->view->assign('keywords','教学管理系统');
		$this->view->assign('desc','教学案例');

		// 数据总数
		$this->view->count=UserModel::count();

		// 判断当前是不是admin用户
		// 先通过session获取到用户登录名
		$userName=Session::get('user_info.name');
		if($userName=='admin'){
			$list=UserModel::all(); //admin用户可以查看所有记录，数据要经过模型获取器处理
		}else{
			// 为了共用列表模板，使用了all()，其实这里使用get()更符合逻辑，但有时也要变通
			// 非admin用户只能看到自己的信息，数据要经过模型获取器处理
			$list=UserModel::all(['name'=>$userName]);
		}

		$this->view->assign('list',$list);
		return $this->view->fetch('admin_list');
	}

	// 管理员状态变更
	public function setStatus(Request $request){
		$user_id=$request->param('id');
		$result=UserModel::get($user_id);
		if($result->getData('status')==1){
			UserModel::update(['status'=>0],['id'=>$user_id]);
		}else{
			UserModel::update(['status'=>1],['id'=>$user_id]);
		}
	}

	// 管理员编辑
	public function adminEdit(Request $request){
		$user_id=$request->param('id');
		$result=UserModel::get($user_id);
		$this->assign('user_info',$result->getData());

		return $this->fetch();

	}

	// 更新管理员数据
	public function editUser(Request $request){
		// 获取表单返回数据
		$param=$request->param();

		// 去掉表单中为空的数据
		foreach ($param as $key => $value) {
			if(trim($value)!=''){
				$data[$key]=$value;
			}
		}

		$condition=['id'=>$data['id']];
		$result=UserModel::update($data,$condition);

		// 如果是admin用户，更新当前session中用户信息user_info中的角色role,供页面调用
		if(Session::get('user_info.name')=='admin'){
			Session::set('user_info.role',$data['role']);
		}

		if($result==true){
			return ['status'=>1,'message'=>'更新成功'];
		}else{
			return ['status'=>0,'message'=>'更新失败，请检查'];
		}
	}

	// 删除管理员
	public function deleteUser(Request $request){
		$user_id=$request->param('id');
		UserModel::update(['is_delete'=>1],['id'=>$user_id]);
		UserModel::destroy($user_id);
	}

	// 批量恢复
	public function unDelete(){
		UserModel::update(['delete_time'=>NULL],['is_delete'=>1]);
	}

	// 添加管理员
	public function adminAdd(){
		return $this->fetch();
	}

	// 检查用户名是否可用
	public function checkUserName(Request $request){
		$userName=trim($request->param('name'));
		$status=1;
		$message='用户名可用';

		if(UserModel::get(['name'=>$userName])){
			// 如果表中查询到该用户名
			$status=0;
			$message='用户名重复，请重新输入';
		}

		return ['status'=>$status,'message'=>$message];
	}

	// 检查邮箱是否可用
	public function checkUserEmail(Request $request){
		$userEmail=$request->param('email');
		$status=1;
		$message='邮箱可用';
		if(UserModel::get(['email'=>$userEmail])){
			//查询表中找到了该邮箱,修改返回值
			$status=0;
			$message='邮箱重复，请重新输入';
		}

		return ['status'=>$status,'message'=>$message];
	}

	// 增加用户
	public function addUser(Request $request){
		$data=$request->param();
		$status=1;
		$message='添加成功';

		// 验证规则
		$rule=[
			'name|用户名'=>"require|min:3|max:10",
			'password|密码'=>"require|min:3|max:10",
			'email|邮箱'=>"require|email"
		];

		// 验证
		$result=$this->validate($data,$rule);

		if($result===true){
			// 插入数据
			$user=UserModel::create($data);

			if($user==null){
				$status=0;
				$message='添加失败';
			}
		}

		return ['status'=>$status,'message'=>$message];
	}
}